package cn.iocoder.yudao.module.call.service.listenaction;

import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
import cn.iocoder.yudao.module.call.dal.dataobject.ivrintentionlabelstatistics.IvrIntentionLabelStatisticsDO;
import cn.iocoder.yudao.module.call.dal.dataobject.listenactionallow.ListenActionAllowDO;
import cn.iocoder.yudao.module.call.dal.dataobject.record.CallRecordDO;
import cn.iocoder.yudao.module.call.service.listenaction.action.CallAction;
import cn.iocoder.yudao.module.call.service.listenaction.action.CallActionFactory;
import cn.iocoder.yudao.module.call.service.listenaction.action.dto.ActionInfoDTO;
import cn.iocoder.yudao.module.call.service.listenaction.listen.CallListen;
import cn.iocoder.yudao.module.call.service.listenaction.listen.CallListenFactory;
import cn.iocoder.yudao.module.call.service.listenaction.listen.dto.ListenActionParamDTO;
import cn.iocoder.yudao.module.call.service.listenaction.listen.dto.ListenInfoDTO;
import cn.iocoder.yudao.module.call.service.listenactionallow.ListenActionAllowService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import org.springframework.validation.annotation.Validated;

import cn.iocoder.yudao.module.call.controller.admin.listenaction.vo.*;
import cn.iocoder.yudao.module.call.dal.dataobject.listenaction.ListenActionDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import cn.iocoder.yudao.module.call.dal.mysql.listenaction.ListenActionMapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;

/**
 * 外呼任务动作绑定 Service 实现类
 *
 * @author 数创万维
 */
@Service
@Validated
@Slf4j
public class ListenActionServiceImpl implements ListenActionService {

    @Resource
    private ListenActionMapper listenActionMapper;

    @Resource
    private CallListenFactory listenFactory;

    @Resource
    private CallActionFactory actionFactory;

    @Resource
    private ListenActionAllowService listenActionAllowService;

    @Override
    public Long createListenAction(ListenActionSaveReqVO createReqVO) {
        // 插入
        ListenActionDO listenAction = BeanUtils.toBean(createReqVO, ListenActionDO.class);
        listenActionMapper.insert(listenAction);
        // 返回
        return listenAction.getId();
    }

    @Override
    public void updateListenAction(ListenActionSaveReqVO updateReqVO) {
        // 更新
        ListenActionDO updateObj = BeanUtils.toBean(updateReqVO, ListenActionDO.class);
        listenActionMapper.updateById(updateObj);
    }

    @Override
    public void updateStatusListenAction(ListenActionUpdateStatusReqVO updateReqVO) {
        // 更新
        ListenActionDO updateObj = BeanUtils.toBean(updateReqVO, ListenActionDO.class);
        listenActionMapper.updateById(updateObj);
    }

    @Override
    public void deleteListenAction(Long id) {
        // 删除
        listenActionMapper.deleteById(id);
    }

    @Override
    public ListenActionDO getListenAction(Long id) {
        return listenActionMapper.selectById(id);
    }

    @Override
    public PageResult<ListenActionDO> getListenActionPage(ListenActionPageReqVO pageReqVO) {
        return listenActionMapper.selectPage(pageReqVO);
    }

    @Override
    public List<ListenInfoDTO> getListenList() {
        List<ListenInfoDTO> list = new ArrayList<>();
        Map<String, CallListen> callListenMap = listenFactory.getHandlerMap();
        callListenMap.forEach((k, v) -> {
            list.add(v.info());
        });
        return list;
    }

    @Override
    public List<ActionInfoDTO> getActionListByListen(String ListenCode) {
        List<ActionInfoDTO> list = new ArrayList<>();
        List<ListenActionAllowDO> actionCodeList = listenActionAllowService.getActionListByListen(ListenCode);

        actionCodeList.forEach(actionAllowDO -> {
            list.add(actionFactory.getHandler(actionAllowDO.getAction()).info());
        });
        return list;
    }




    @Override
    public void taskListenTrigger(String source, Long sourceId, CallRecordDO callRecordDO, IvrIntentionLabelStatisticsDO ivrIntentionLabelStatisticsDO) {

        List<ListenActionDO> list = listenActionMapper.selectList(ListenActionDO::getSource, source, ListenActionDO::getSourceId, sourceId);
        ListenActionParamDTO paramDTO = new ListenActionParamDTO().setCallRecordDO(callRecordDO).setIvrIntentionLabelStatisticsDO(ivrIntentionLabelStatisticsDO);
        list.forEach((listenActionDO) -> {
            CallListen callListen = listenFactory.getHandler(listenActionDO.getListen());
            paramDTO.setListenActionDO(listenActionDO);
            //验证是否需要执行
            if (Objects.nonNull(callListen) && callListen.verify(paramDTO)) {
                //执行对应动作
                CallAction callAction = actionFactory.getHandler(listenActionDO.getAction());
                callAction.execute(paramDTO);
            }
        });
    }



}